/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.maven.plugin; import org.apache.maven.artifact.Artifact; import org.apache.maven.artifact.DependencyResolutionRequiredException; import org.apache.maven.artifact.resolver.filter.CumulativeScopeArtifactFilter; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugin.MojoFailureException; import org.apache.maven.plugins.annotations.LifecyclePhase; import org.apache.maven.plugins.annotations.Mojo; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.plugins.annotations.ResolutionScope; import org.apache.maven.project.MavenProject; import org.drools.compiler.compiler.BPMN2ProcessFactory; import org.drools.compiler.compiler.DecisionTableFactory; import org.drools.compiler.compiler.GuidedDecisionTableFactory; import org.drools.compiler.compiler.GuidedRuleTemplateFactory; import org.drools.compiler.compiler.GuidedScoreCardFactory; import org.drools.compiler.compiler.PMMLCompilerFactory; import org.drools.compiler.compiler.ProcessBuilderFactory; import org.drools.compiler.kie.builder.impl.InternalKieModule; import org.drools.compiler.kie.builder.impl.KieContainerImpl; import org.drools.compiler.kie.builder.impl.KieMetaInfoBuilder; import org.drools.compiler.kie.builder.impl.KieProject; import org.drools.compiler.kie.builder.impl.ResultsImpl; import org.drools.compiler.kie.builder.impl.ZipKieModule; import org.drools.compiler.kproject.ReleaseIdImpl; import org.drools.compiler.kproject.models.KieModuleModelImpl; import org.kie.api.KieServices; import org.kie.api.builder.KieRepository; import org.kie.api.builder.Message; import org.kie.api.builder.ReleaseId; import org.kie.api.builder.model.KieModuleModel; import java.io.File; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; import java.util.Arrays; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; import static org.drools.compiler.kie.builder.impl.KieBuilderImpl.setDefaultsforEmptyKieModule; /** * This goal builds the Drools files belonging to the kproject. */ @Mojo(name = "build", requiresDependencyResolution = ResolutionScope.COMPILE_PLUS_RUNTIME, requiresProject = true, defaultPhase = LifecyclePhase.COMPILE) public class BuildMojo extends AbstractKieMojo { /** * Directory containing the generated JAR. */ @Parameter(required = true, defaultValue = "${project.build.outputDirectory}") private File outputDirectory; /** * Project resources folder. */ @Parameter(required = true, defaultValue = "src/main/resources") private File sourceFolder; @Parameter(required = true, defaultValue = "${project}") private MavenProject project; @Parameter private Map<String, String> properties; public void execute() throws MojoExecutionException, MojoFailureException { ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader(); List<InternalKieModule> kmoduleDeps = new ArrayList<InternalKieModule>(); try { Set<URL> urls = new HashSet<URL>(); for (String element : project.getCompileClasspathElements()) { urls.add(new File(element).toURI().toURL()); } project.setArtifactFilter(new CumulativeScopeArtifactFilter(Arrays.asList("compile", "runtime"))); for (Artifact artifact : project.getArtifacts()) { File file = artifact.getFile(); if (file != null) { urls.add(file.toURI().toURL()); KieModuleModel depModel = getDependencyKieModel(file); if (depModel != null) { ReleaseId releaseId = new ReleaseIdImpl(artifact.getGroupId(), artifact.getArtifactId(), artifact.getVersion()); kmoduleDeps.add(new ZipKieModule(releaseId, depModel, file)); } } } urls.add(outputDirectory.toURI().toURL()); ClassLoader projectClassLoader = URLClassLoader.newInstance(urls.toArray(new URL[0]), Thread.currentThread().getContextClassLoader()); Thread.currentThread().setContextClassLoader(projectClassLoader); BPMN2ProcessFactory.loadProvider(projectClassLoader); DecisionTableFactory.loadProvider(projectClassLoader); ProcessBuilderFactory.loadProvider(projectClassLoader); PMMLCompilerFactory.loadProvider(projectClassLoader); GuidedDecisionTableFactory.loadProvider(projectClassLoader); GuidedRuleTemplateFactory.loadProvider(projectClassLoader); GuidedScoreCardFactory.loadProvider(projectClassLoader); } catch (DependencyResolutionRequiredException e) { throw new RuntimeException(e); } catch (MalformedURLException e) { throw new RuntimeException(e); } KieServices ks = KieServices.Factory.get(); try { setSystemProperties(properties); KieRepository kr = ks.getRepository(); InternalKieModule kModule = (InternalKieModule)kr.addKieModule(ks.getResources().newFileSystemResource(sourceFolder)); for (InternalKieModule kmoduleDep : kmoduleDeps) { kModule.addKieDependency(kmoduleDep); } KieContainerImpl kContainer = (KieContainerImpl) ks.newKieContainer(kModule.getReleaseId()); KieProject kieProject = kContainer.getKieProject(); ResultsImpl messages = kieProject.verify(); List<Message> errors = messages.filterMessages(Message.Level.ERROR); if (!errors.isEmpty()) { for (Message error : errors) { getLog().error(error.toString()); } throw new MojoFailureException("Build failed!"); } else { new KieMetaInfoBuilder(new DiskResourceStore(outputDirectory), kModule).writeKieModuleMetaInfo(); } } finally { Thread.currentThread().setContextClassLoader(contextClassLoader); } getLog().info("KieModule successfully built!"); } private KieModuleModel getDependencyKieModel(File jar) { ZipFile zipFile = null; try { zipFile = new ZipFile( jar ); ZipEntry zipEntry = zipFile.getEntry( KieModuleModelImpl.KMODULE_JAR_PATH ); if (zipEntry != null) { KieModuleModel kieModuleModel = KieModuleModelImpl.fromXML(zipFile.getInputStream(zipEntry)); setDefaultsforEmptyKieModule(kieModuleModel); return kieModuleModel; } } catch ( Exception e ) { } finally { if (zipFile != null) { try { zipFile.close(); } catch (IOException e) { } } } return null; } }